ホームに戻る
出典 :
レジストリへの書き込み、読み込み、削除を行う - .NET Tips (VB.NET,C#...) Microsoft.Win32.Registry クラス - .NET | Microsoft Learn Registry クラス (Microsoft.Win32) | Microsoft Learn
目次 :

レジストリの操作

Microsoft.Win32.Registry および RegistryKey クラスを用いることで、Windowsレジストリの操作を行うことができる。
以下、コードはすべてC#での例。

基本(ルート)キーの取得

以下に記す Microsoft.Win32.Registry の各フィールドには、レジストリの基本キーが読み込まれる。
フィールド 対応する基本キー 格納される内容
ClassesRoot HKEY_CLASSES_ROOT ドキュメントの型(またはクラス)と、それらに関連付けられるプロパティ
CurrentConfig HKEY_CURRENT_CONFIG 各ユーザに共通のハードウェア構成情報
CurrentUser HKEY_CURRENT_USER 現在のユーザ設定に関する情報
LocalMachine HKEY_LOCAL_MACHINE ローカルコンピュータの構成データ
PerformanceData HKEY_PERFORMANCE_DATA ソフトウェアコンポーネントのパフォーマンス情報
Users HKEY_USERS 既定のユーザ構成に関する情報

レジストリへの書き込み

RegistryKey.CreateSubKey() メソッドでキーを開き、RegistryKey.SetValue() メソッドで書き込みを行う。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を開く Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\test\sub"); // 文字列を書き込む ⇒ REG_SZ 型で書き込まれる regkey.SetValue("string", "StringValue"); // 整数(Int32)を書き込む ⇒ REG_DWORD 型で書き込まれる regkey.SetValue("int", 100); // 文字列配列を書き込む ⇒ REG_MULTI_SZ 型で書き込まれる string[] s = new string[] { "1", "2", "3" }; regkey.SetValue("StringArray", s); // バイト配列を書き込む ⇒ REG_BINARY 型で書き込まれる byte[] bs = new byte[] { 0, 1, 2 }; regkey.SetValue("Bytes", bs); // キーを閉じる regkey.Close();
結果 : HKEY_CURRENT_USER\Software\test\sub
画像
「(既定)」、「(標準)」に書き込む場合は、SetValue() の第1引数(値の名前)に空文字列か null を指定する。

注意が必要な点

RegistryKey.CreateSubKey() メソッドは、引数で指定されたサブキーが存在しない場合は新たにサブキーを作成する。
新たにキーを作成したくない場合は、RegistryKey.OpenSubKey() メソッドを用いて以下のようにする。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を開く Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", true);

レジストリへの書き込み(型を指定)

前節のように型を指定せず書き込んだ場合、既定の型が割り当てられる。
(Int32 型整数は REG_DWORD となるが、それ以外の整数は REG_SZ となる。)
SetValue() の第3引数で書き込む型を指定することができる。但し、値が指定された型に適合しない場合はエラーとなる。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を開く Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\test\sub"); // REG_EXPAND_SZ で書き込む regkey.SetValue("ExpandString", "%windir%", Microsoft.Win32.RegistryValueKind.ExpandString); // REG_QWORD で書き込む regkey.SetValue("QWord", 1000, Microsoft.Win32.RegistryValueKind.QWord); // キーを閉じる regkey.Close();
第3引数は Microsoft.Win32.RegistryValueKind で、メンバは以下の通りである。
メンバ 対応するデータ型 格納できる値
Binary REG_BINARY バイナリデータ
DWord REG_DWORD 32ビットの数値
ExpandString REG_EXPAND_SZ 値を取得するときに展開される、環境変数(%PATH%など)を含む文字列
MultiString REG_MULTI_SZ 文字列の配列
QWord REG_QWORD 64ビットの数値
String REG_SZ 文字列
Unknown - サポート外のデータ型。既定値

レジストリの読み込み

レジストリの値を読み込む際は、RegistryKey.OpenSubKey() メソッドでキーを開き、RegistryKey.GetValue() メソッドで読み込む。
「(既定)」、「(標準)」を読み込む場合は、GetValue() の第1引数(値の名前)に空文字列か null を指定する。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を読み取り専用で開く Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false); // キーが存在しないときは null が返される if (regkey == null) return; // 文字列を読み込む // (指定した名前の値が存在しないときは null が返される) string stringValue = (string)regkey.GetValue("string"); // キーに値が存在しないときに指定した値を返すようにするには、次のようにする // (ここでは"default"を返す) // string stringValue = (string)regkey.GetValue("string", "default"); // 整数を読み込む int intValue = (int)regkey.GetValue("int"); long longVal = (long)regkey.GetValue("QWord"); // 文字列配列を読み込む string[] strings = (string[])regkey.GetValue("StringArray"); // バイト配列を読み込む byte[] bytes = (byte[])regkey.GetValue("Bytes"); // キーを閉じる regkey.Close();

REG_EXPAND_SZ 型のデータをそのまま取得する

GetValue() の第3引数に Microsoft.Win32.RegistryValueOptions.DoNotExpandEnvironmentNames を指定すると、環境変数を展開せずに値を取得できる。

サブキーと値の名前を取得

キーに存在するすべてのサブキーは RegistryKey.GetSubKeyNames() メソッド、すべての値の名前は RegistryKey.GetValueNames() メソッドで取得できる。
またサブキーおよび値の数は RegistryKey.SubKeyCount()RegistryKey.ValueCount() メソッドで取得できる。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を読み取り専用で開く Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false); // キーにあるサブキーの数を表示 Console.WriteLine("サブキーの数:{0}", regkey.SubKeyCount); // キーにあるすべてのサブキー名を表示 string[] keyNames = regkey.GetSubKeyNames(); foreach (string k in keyNames) { Console.WriteLine(k); } // キーにある値の数を表示 Console.WriteLine("キーの値の数:{0}", regkey.ValueCount); // キーにあるすべての値の名前を表示 string[] valueNames = regkey.GetValueNames(); foreach (string v in valueNames) { Console.WriteLine(v); } // キーを閉じる regkey.Close();

値の種類を取得

RegistryKey.GetValueKind() メソッドで値の種類( RegistryValueKind 列挙体)を取得できる。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を読み取り専用で開く Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false); // "string" の値が REG_SZ ならば // string型として取得する if( regkey.GetValueKind("string") == Microsoft.Win32.RegistryValueKind.String ) { string stringValue = (string)regkey.GetValue("string"); } // キーを閉じる regkey.Close();

レジストリの削除

キーにある値は RegistryKey.DeleteValue() メソッドで削除できる。
キー自体は RegistryKey.DeleteSubKey() メソッドで削除できるが、指定されたキーがサブキーを持っていると失敗する。
RegistryKey.DeleteSubKeyTree() メソッドを用いると、サブキーの有無を問わず強制的に削除できる。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を書き込み許可で開く Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", true); // "HKEY_CURRENT_USER\Software\test" にある "string" という値を削除する regkey.DeleteValue("string"); // 次のようにすると指定した値が見つからなくてもエラーが出ない // regkey.DeleteValue("string", false); // キー "HKEY_CURRENT_USER\Software\test\sub" を削除する regkey.DeleteSubKey("sub"); // 次のようにすると指定したキーが見つからなくてもエラーが出ない // regkey.DeleteSubKey("sub", false); // キーを閉じる regkey.Close(); // "HKEY_CURRENT_USER\Software\test" 以下を強制的に削除する Microsoft.Win32.Registry.CurrentUser.DeleteSubKeyTree(@"Software\test");

静的メソッドを用いた読み書き

静的メソッド Registry.GetValue()Registry.SetValue() を用いることでも値の読み書きが可能である。
内部では RegistryKey.OpenSubKey() でキーを開き、値を RegistryKey.GetValue() で取得、または RegistryKey.SetValue() で更新した後 RegistryKey.Close() でキーを閉じている。 一度の手順で簡便に読み書きができる。キーの指定方法が異なる点に注意。
// キー HKEY_CURRENT_USER\Software\test\sub の値 "string" を読み込む string stringValue = (string)Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\Software\test\sub", "string", "default"); // キー HKEY_CURRENT_USER\Software\test\sub の値 "string" を書き込む Microsoft.Win32.Registry.SetValue(@"HKEY_CURRENT_USER\Software\test\sub", "string", "StringValue");